package com.kamistoat.meimeichat.meimeichatclient.infrastructure.util;


import java.net.SocketAddress;
import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class CacheUtil {
    public static String userId = null;
    public static String userNickname = null;
    public static String userHead = null;
    /**
     * 对话框组，保存当前所有展开的对话框的talkId
     */
    public static Map<String, Integer> talkMap = new ConcurrentHashMap<String, Integer>(16);
    /**
     * P2P地址组。保存当前所有在线好友的P2P地址.
     */
    public static Map<String, SocketAddress> p2pMap = new ConcurrentHashMap<>(16);
    /**
     * 记录上一次和某个好友发起P2P通信的时间，防止建立P2P连接后长时间未进行通信，导致NET将映射收回。
     * 注意，该Map将唯一决定是否以P2P与好友通信.
     * 1. 每次发送消息前检查Map中是否存在好友Id，如果不存在，则检查p2pMap中好友是否在线，如不在线则不建立P2P链接，否则通知服务器建立两者的P2P链接。
     * 2. 如果存在，但是时间和当前时间相差超过5分钟，则重复上述操作。
     * 3. 如果存在且相差时间小于5分钟，则直接向其P2P链接发送消息。
     *
     * p2pMap严格包含p2pDateMap，用户上线时，只添加进p2pMap，用户下线时，同时从两个Map中删除。
     * 漫游消息。仍然会发送一份消息给服务器用于消息漫游入库，所以不存在离线用户消息丢失。
     */
    public static Map<String, Date> p2pDateMap = new ConcurrentHashMap<>(16);

    /**
     * UDP打洞只能在锥形路由器上完成。所有移动设备使用的蜂窝网络都是对称性路由器，是无法进行UDP打洞的。
     * 但是此时用户确实是在线，又不能每次都去建立UDP链接耗费3秒。因此使用一个p2pDateFailureMap记录必定失败的
     */
    public static Map<String, Date> p2pFailureDateMap = new ConcurrentHashMap<>(16);
}
